home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / comm2 / termsorc.lha / Extras / Source / gtlayout-source.lha / gtlayout_lib.c < prev    next >
C/C++ Source or Header  |  1995-09-24  |  5KB  |  211 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1995 by Olaf `Olsen' Barthel
  5. **    Freely distributable.
  6. */
  7.  
  8. #include "gtlayout_global.h"
  9.  
  10. struct GTLayoutBase
  11. {
  12.     struct Library         LibNode;
  13.  
  14.     struct ExecBase        *ExecBase;
  15.     struct SignalSemaphore     LockSemaphore;
  16.     BPTR             LibSegment;
  17. };
  18.  
  19. #define SysBase GTLayoutBase -> ExecBase
  20.  
  21. struct Library * __saveds __asm    LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase);
  22. struct Library * __saveds __asm    LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase);
  23. BPTR __saveds __asm        LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase);
  24. BPTR __saveds __asm        LibClose(register __a6 struct GTLayoutBase *GTLayoutBase);
  25. LONG __saveds __asm        LibNull(register __a6 struct GTLayoutBase *GTLayoutBase);
  26.  
  27. STATIC APTR LibVectors[] =
  28. {
  29.     LibOpen,
  30.     LibClose,
  31.     LibExpunge,
  32.     LibNull,
  33.  
  34.     LT_LevelWidth,
  35.     LT_DeleteHandle,
  36.     LT_CreateHandle,
  37.     LT_CreateHandleTagList,
  38.     LT_Rebuild,
  39.     LT_HandleInput,
  40.     LT_BeginRefresh,
  41.     LT_EndRefresh,
  42.     LT_GetAttributesA,
  43.     LT_SetAttributesA,
  44.     LT_AddA,
  45.     LT_NewA,
  46.     LT_EndGroup,
  47.     LT_LayoutA,
  48.     LT_LayoutMenusA,
  49. #ifdef DO_FRACTION_KIND
  50.     LT_Fixed2String,
  51.     LT_String2Fixed,
  52.     LT_FixedMult,
  53. #else
  54.     LibNull,
  55.     LibNull,
  56.     LibNull,
  57. #endif    // DO_FRACTION_KIND
  58.     LT_LabelWidth,
  59.     LT_LabelChars,
  60.     LT_LockWindow,
  61.     LT_UnlockWindow,
  62.     LT_DeleteWindowLock,
  63.     LT_ShowWindow,
  64.     LT_Activate,
  65.     LT_PressButton,
  66.     LT_GetCode,
  67.     LT_GetIMsg,
  68.     LT_ReplyIMsg,
  69.     LT_BuildA,
  70.     LT_RebuildTagList,
  71.     LT_UpdateStrings,
  72.  
  73. #ifdef DO_MENUS
  74.     LT_DisposeMenu,
  75.     LT_NewMenuTemplate,
  76.     LT_NewMenuTagList,
  77.     LT_MenuControlTagList,
  78.     LT_GetMenuItem,
  79.     LT_FindMenuCommand,
  80. #else
  81.     LibNull,
  82.     LibNull,
  83.     LibNull,
  84.     LibNull,
  85.     LibNull,
  86.     LibNull,
  87. #endif    // DO_MENUS
  88.  
  89.     LT_NewLevelWidth,
  90.  
  91.     (APTR)-1
  92. };
  93.  
  94. extern UBYTE __far    LibName[],
  95.             LibID[];
  96.  
  97. extern LONG __far    LibVersion,
  98.             LibRevision;
  99.  
  100. struct { ULONG DataSize; APTR Table; APTR Data; struct Library * (*Init)(); } __aligned LibInitTab =
  101. {
  102.     sizeof(struct GTLayoutBase),
  103.     LibVectors,
  104.     NULL,
  105.     LibInit
  106. };
  107.  
  108. struct Library * __saveds __asm
  109. LibInit(register __a0 BPTR Segment,register __d0 struct GTLayoutBase *GTLayoutBase,register __a6 struct ExecBase *ExecBase)
  110. {
  111. #if defined(CPU_68020) || defined(CPU_68030) || defined(CPU_68040)
  112.     if(ExecBase -> LibNode . lib_Version < 37 || !(ExecBase -> AttnFlags & AFF_68020))
  113.         return(NULL);
  114. #else
  115.     if(ExecBase -> LibNode . lib_Version < 37)
  116.         return(NULL);
  117. #endif    // CPU_...
  118.  
  119.     GTLayoutBase -> LibNode . lib_Node . ln_Type    = NT_LIBRARY;
  120.     GTLayoutBase -> LibNode . lib_Node . ln_Name    = LibName;
  121.     GTLayoutBase -> LibNode . lib_Flags        = LIBF_CHANGED | LIBF_SUMUSED;
  122.     GTLayoutBase -> LibNode . lib_Version        = LibVersion;
  123.     GTLayoutBase -> LibNode . lib_Revision        = LibRevision;
  124.     GTLayoutBase -> LibNode . lib_IdString        = (APTR)LibID;
  125.  
  126.     GTLayoutBase -> LibSegment    = Segment;
  127.     GTLayoutBase -> ExecBase    = ExecBase;
  128.  
  129.     InitSemaphore(>LayoutBase -> LockSemaphore);
  130.  
  131.     return(GTLayoutBase);
  132. }
  133.  
  134. struct Library * __saveds __asm
  135. LibOpen(register __a6 struct GTLayoutBase *GTLayoutBase)
  136. {
  137.     GTLayoutBase -> LibNode . lib_Flags &= ~LIBF_DELEXP;
  138.  
  139.     GTLayoutBase -> LibNode . lib_OpenCnt++;
  140.  
  141.     ObtainSemaphore(>LayoutBase -> LockSemaphore);
  142.  
  143.     if(GTLayoutBase -> LibNode . lib_OpenCnt == 1)
  144.     {
  145.         if(!LT_Init())
  146.         {
  147.             LT_Exit();
  148.  
  149.             GTLayoutBase -> LibNode . lib_OpenCnt--;
  150.  
  151.             ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  152.  
  153.             return(NULL);
  154.         }
  155.     }
  156.  
  157.     ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  158.  
  159.     return(GTLayoutBase);
  160. }
  161.  
  162. BPTR __saveds __asm
  163. LibExpunge(register __a6 struct GTLayoutBase *GTLayoutBase)
  164. {
  165.     if(!GTLayoutBase -> LibNode . lib_OpenCnt && GTLayoutBase -> LibSegment)
  166.     {
  167.         BPTR TempSegment = GTLayoutBase -> LibSegment;
  168.  
  169.         Remove((struct Node *)GTLayoutBase);
  170.  
  171.         FreeMem((BYTE *)GTLayoutBase - GTLayoutBase -> LibNode . lib_NegSize,GTLayoutBase -> LibNode . lib_NegSize + GTLayoutBase -> LibNode . lib_PosSize);
  172.  
  173.         return(TempSegment);
  174.     }
  175.     else
  176.     {
  177.         GTLayoutBase -> LibNode . lib_Flags |= LIBF_DELEXP;
  178.  
  179.         return(NULL);
  180.     }
  181. }
  182.  
  183. BPTR __saveds __asm
  184. LibClose(register __a6 struct GTLayoutBase *GTLayoutBase)
  185. {
  186.     if(GTLayoutBase -> LibNode . lib_OpenCnt)
  187.         GTLayoutBase -> LibNode . lib_OpenCnt--;
  188.  
  189.     ObtainSemaphore(>LayoutBase -> LockSemaphore);
  190.  
  191.     if(!GTLayoutBase -> LibNode . lib_OpenCnt)
  192.     {
  193.         LT_Exit();
  194.  
  195.         ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  196.  
  197.         if(GTLayoutBase -> LibNode . lib_Flags & LIBF_DELEXP)
  198.             return(LibExpunge(GTLayoutBase));
  199.     }
  200.     else
  201.         ReleaseSemaphore(>LayoutBase -> LockSemaphore);
  202.  
  203.     return(NULL);
  204. }
  205.  
  206. LONG __saveds __asm
  207. LibNull(register __a6 struct GTLayoutBase *GTLayoutBase)
  208. {
  209.     return(NULL);
  210. }
  211.